---
title: 重新认识IOC
---
## IOC 发展简介
### 什么是 IOC
In software engineering, inversion of control (IoC) is a programming principle. IoC inverts the flow of control as compared to traditional control flow. In IoC, custom-written portions of a computer

## IOC 主要实现策略

在面向对象编程中，有几种基础的技术来实现 IoC：
* 服务定位模式
通常通过 JNDI 这种技术获取 Java EE 的组件，比如 EJB 组件、DataSource 组件等等。
* 通过依赖注入
  * 构造器注入
  * 参数注入
  * Setter 注入
  * 接口注入
* 上下文依赖查询
Java Beans 技术，Java Beans 里面有一个通用的上下文，叫做 beanContext，这里面既可以传输 Bean ，也可以管理 Bean 的层次性。
* 通过模板方法模式实现
比如 JDBC Template 这样的实现，这种实现会给我们一个 Statement 这样的模板，我们只需要实现 Statement 里面的回调方法，就可以实现对 Statement 的控制。
* 通过策略模式实现
:::tip
主要分为依赖查找和依赖注入两种方式实现。
:::

## IOC容器的职责
1. 依赖处理
    * 依赖查找：根据某种规则进行查找，比如根据名称或根据类型来查找。
    * 依赖注入
2. 生命周期管理
    * 容器
    * 托管的资源（Java Beans 或 其它资源）
3. 配置
    * 容器
    * 外部化配置
    * 托管的资源（Java Beans 或 其它资源）
## IOC容器的实现
### Java SE
* Java Beans
* ServiceLoader SPI
* JNDI(Java Naming and Directory Interface)
### Java EE
* EJB(Enterprise Java Beans)
* Servlet
### 第三方
* Spring Framework
* Google Guice
## 传统 IOC 容器实现
## 轻量级 IOC 容器

### 轻量级容器的特点
* A container that can manage application code
* A container that is quick to start up
* A container that doesn't require any special deployment steps to deploy objects within it
* A container that has such a light footprint and minimal API dependencies that is can be run in a variety of environments
* A container that sets the bar for adding a managed object so low in terms of deployment effort and performance overhead that it's possible to deploy and manage fine-grained components, even one-per-class fine-grained objects, as well as coarse-grained components

### 好处
* Escaping the monolithic container
* Maximizing code reusability
* Greater Object orientation
* Greater productivity
* Better testability
## 依赖查找 VS 依赖注入

| 类型     | 依赖处理 | 实现便利性 | 代码侵入性   | API 依赖性     | 可读性 |
| -------- | -------- | ---------- | ------------ | -------------- | ------ |
| 依赖查找 | 主动获取 | 相对繁琐   | 侵入业务逻辑 | 依赖容器 API   | 良好   |
| 依赖注入 | 被动提供 | 相对便利   | 低侵入性     | 不依赖容器 API | 一般   |



## 构造器注入 VS Setter 注入

The Spring  team generally **advocates constructor injection** ,as it lets you implement application components as immutable objects and ensures that required dependencies are not null.

## 面试题

### 1. 什么是 IoC ？ 

简单来说，IoC 是反转控制，类似于好莱坞原则，主要有依赖查找和依赖注入实现。

按照IoC 的定义，很多方面都是 IoC，比如 JavaBeans 是 IoC 的一个容器实现，那么 Servlet 的容器也是 IoC 的实现。因为 Servlet 可以去依赖或反向地通过 JNDI 的方式进行得到一些外部的一些资源，包括 DataSource 或者相关的 EJB 的组件。

与此同时，像 Spring Framework 或者 Peak Container 的依赖注入的框架也能够帮助我们去实现 IoC。

消息其实也算，消息也是被动的，传统的调用链路是主动拉的模式，IoC 则是一种推的模式，那么退的模式在消息事件以及各种这样类似于这种反向的观察者模式的扩展都属于 IoC。  

### 依赖查找和依赖注入的区别

依赖查找是主动或手动的依赖查找方式，通常需要依赖容器或标准 API 实现。而依赖注入则是手动或自动依赖绑定的方式，无需依赖特定的容器和 API。

依赖注入依赖的 API 会更少一些。

依赖注入从哪里来以及用什么规则去映射。

### Spring 作为 IoC 容器有什么优势？

典型的 IoC 管理，依赖查找和依赖注入

AOP 抽象

事务抽象

事件机制

SPI 扩展

强大的第三方整合

易测试性

更好的面向对象
